package com.sbl.test;

import com.sbl.domain.Account;
import com.sbl.service.IAccountServiceDatabaseXML;
import config.SpringConfiguration;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import java.util.List;

/**
 * 出现的原因：
 *          1.应用程序的入口是main方法
 *          2.junit单元测试中，也集成了main方法，会判断是或有@Test
 *              注解，如果有就让有注解的方法执行
 *          3.junit不会管我们是否采用了spring框架，在执行方法的时候
 *              根本不管我们是不是使用了spring框架，所以不读取配置文件/创建容器
 *          4.基于以上三点可知道：
 *              当测试方法执行的时候，没有Ioc容器，就算写了AutoWired
 *              注解，也无法实现注入
 *
 *
 * 使用Junit单元测试：测试我们的配置
 * Spring整合junit的配置
 *      1、导入spring整合junit的jar(坐标)
 *      2、使用Junit提供的一个注解把原有的main方法替换了，替换成spring提供的
 *             @Runwith
 *      3、告知spring的运行器，spring和ioc创建是基于xml还是注解的，并且说明位置
 *          @ContextConfiguration
 *                  locations：指定xml文件的位置，加上classpath关键字，表示在类路径下
 *                  classes：指定注解类所在地位置。@ContextConfiguration("classpath:SpringConfiguration.xml")
 *
 *   当我们使用spring 5.x版本的时候，要求junit的jar必须是4.12及以上
 *
 */
@RunWith(SpringJUnit4ClassRunner.class) //让测试 运行在spring 环境中
@ContextConfiguration(classes = SpringConfiguration.class)//创建容器要基于的东西
public class AccountServiceTest2 {

    @Autowired
    private IAccountServiceDatabaseXML as = null;


    @Test
    public void testFindAll() {
        //3.执行方法
        List<Account> accounts = as.findAllAccount();
        for(Account account : accounts){
            System.out.println(account);
        }
    }

    @Test
    public void testFindOne() {
        //3.执行方法
        Account account = as.findAccountById(1);
        System.out.println(account);
    }

    @Test
    public void testSave() {
        Account account = new Account();
        account.setName("test anno");
        account.setMoney(12345f);
        //3.执行方法
        as.saveAccount(account);

    }

    @Test
    public void testUpdate() {
        //3.执行方法
        Account account = as.findAccountById(4);
        account.setMoney(23456f);
        as.updateAccount(account);
    }

    @Test
    public void testDelete() {
        //3.执行方法
        as.deleteAccount(4);
    }
}
